#include "w25q64.h"
void w25q64_spi_init(void)
{
    spi_parameter_struct spi_init_struct;
    rcu_periph_clock_enable(RCU_GPIOF);
    rcu_periph_clock_enable(RCU_SPI4);
    // rcu_periph_clock_enable(RCU_AF);
    // 引脚复用
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_7);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_8);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_9);
    // 引脚模式
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
    // 输出模式
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    // 配置CS引脚模式
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_6);
    // 配置CS输出模式
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    // W25Q64不选中
    gpio_bit_write(GPIOF, GPIO_PIN_6, SET);

    spi_i2s_deinit(SPI0);
    spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode = SPI_MASTER;
    spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
    spi_init_struct.nss = SPI_NSS_SOFT;
    spi_init_struct.endian = SPI_ENDIAN_MSB;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
    spi_init_struct.prescale = SPI_PSC_2;
    spi_init(SPI4, &spi_init_struct);
    spi_enable(SPI4);
}
uint8_t w25q64_read_write_byte(uint8_t byte)
{

    while (RESET == spi_i2s_flag_get(SPI4, SPI_FLAG_TBE))
        ;
    spi_i2s_data_transmit(SPI4, byte);
    while (RESET == spi_i2s_flag_get(SPI4, SPI_FLAG_RBNE))
        ;
    return spi_i2s_data_receive(SPI4);
}
uint16_t w25q64_read_id(void)
{
    uint8_t cmd = 0x90;
    uint8_t id[2];
    gpio_bit_write(GPIOF, GPIO_PIN_6, RESET);
    w25q64_read_write_byte(cmd);
    id[0] = w25q64_read_write_byte(0x00);
    id[1] = w25q64_read_write_byte(0x00);
    w25q64_read_write_byte(0x00);
    id[0] = w25q64_read_write_byte(0x00);
    id[1] = w25q64_read_write_byte(0x00);
    gpio_bit_write(GPIOF, GPIO_PIN_6, SET);
    return (id[0] << 8) | id[1];
}
void w25q64_write_enable(void)
{
    // uint8_t cmd = 0x06;
    // gpio_bit_write(GPIOF, GPIO_PIN_6, RESET);
    // spi_send_data8(SPI4, cmd);
    // gpio_bit_write(GPIOF, GPIO_PIN_6, SET);
}
